package com.fy.fyai.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fy.fyai.common.constant.KeysConstant;
import com.fy.fyai.common.ex.handler.ExHandler;
import com.fy.fyai.common.result.R;
import com.fy.fyai.common.utils.LoginUser;
import com.fy.fyai.model.entity.FyUser;
import com.fy.fyai.model.vo.LoginUserSession;
import com.fy.fyai.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

import static com.fy.fyai.common.result.R.ok;

/**
 * @author fwq
 * @description 用户相关控制
 * @date 2025-10-26 09:40
 */
@Slf4j
@RestController
@RequestMapping("/user")
@Tag(name = "用户相关接口")
public class UserController {

    @Resource
    private UserService userService;


    /**
     * 注册用户
     *
     * @param userAccount 用户名
     * @param password    密码
     * @return 响应结果
     */
    @Operation(summary = "注册用户")
    @PostMapping("/register")
    public R register(@RequestParam String userAccount, @RequestParam String password) {
        FyUser user = userService.getOne(new LambdaQueryWrapper<FyUser>().eq(FyUser::getUserAccount, userAccount));
        ExHandler.throwIf(user != null, "用户已存在");
        // 创建新用户
        userService.saveOrUpdate(FyUser.builder()
                .userAccount(userAccount)
                .createTime(new Date())
                .userRole("user")
                .updateTime(new Date())
                .userPassword(password)
                .build());
        return ok("用户注册成功");
    }

    /**
     * 模拟登录，设置登录用户信息到Session
     *
     * @param userAccount 用户名
     * @param password    密码
     * @return 响应结果
     */
    @Operation(summary = "模拟登录")
    @PostMapping("/login")
    public R login(@RequestParam String userAccount, @RequestParam String password) {
        // 校验用户是否存在
        FyUser user = userService.lambdaQuery()
                .eq(FyUser::getUserAccount, userAccount)
                .eq(FyUser::getUserPassword, password)
                .one();
        ExHandler.throwIf(user == null, "用户不存在");

        // 登录成功，先设置登录状态
        StpUtil.login(user.getId()); // 设置登录状态

        // 登录成功，设置登录用户信息到Session
        StpUtil.getSession().set(KeysConstant.LOGIN_SESSION_KEY, LoginUserSession.builder()
                .id(user.getId())
                .userAccount(user.getUserAccount())
                .userRole(user.getUserRole())
                .build());


        return ok(LoginUser.getLoginUser());
    }

    /**
     * 模拟校验登录状态
     *
     * @return 响应结果
     */
    @Operation(summary = "模拟校验登录状态")
    @GetMapping("/checkLogin")
    public R checkLogin() {
        return ok(LoginUser.isLogin());
    }
}
